package upload

import (
	"os"
	"path"
	"path/filepath"
	"time"

	"192.168.1.75/go-pkg/errorx"
	"192.168.1.75/go-pkg/helper"
	"github.com/gin-gonic/gin"
)

// UploadFile 上传固件
// 文件上传到./upload/tmp 临时文件夹
// 如果1个小时内没有被确认移动走，则会在下载上传时被删除
// 返回上传信息 struct{name,url},err
func UploadFile(ctx *gin.Context, saveDir string) (url string, err error) {
	saveDir += "/temp"
	// 创建目标文件夹-temp
	// 先判断是否存在，不存在就直接创建
	_, err = os.Stat(saveDir)
	if err != nil {
		err = os.MkdirAll(saveDir, os.ModePerm)
		if err != nil {
			return "", errorx.New("创建文件夹失败", -1)
		}
	}
	// 删除过期的缓存文件
	go func() {
		diffTime := int64(3600)      // 超时时间为1个小时
		nowTime := time.Now().Unix() // 当前时间，使用Unix时间戳
		_ = filepath.Walk(saveDir, func(path string, fi os.FileInfo, err error) error {
			if !fi.IsDir() {
				fileTime := fi.ModTime().Unix()
				if (nowTime - fileTime) > diffTime { // 判断文件是否过期
					os.Remove(path)
				}
			}
			return nil
		})
	}()

	// 处理上传的文件
	file, err := ctx.FormFile("file")
	if err != nil {
		return "", errorx.New("未获取到上传的文件", -1)
	}
	primaryKey, err := helper.UUID{}.String()
	if err != nil {
		return "", errorx.New("新建文件名失败", -1)
	}

	// 保存上传的文件
	newFilename := primaryKey + "-" + file.Filename
	err = ctx.SaveUploadedFile(file, path.Join(saveDir, newFilename))
	if err != nil {
		return "", errorx.New("文件保存失败", -1)
	}
	// 返回上传结果
	return path.Join(saveDir, newFilename), nil
}
